mutexy na win98, padani aplikace

Otázka od: Karel Plechota

22. 6. 2004 10:07

zdravim,

nedavno jsem predelal rizeni threadu v moji aplikaci pomoci mutexu, ale mam
problem. na w2000 aplikace funguje ale na w98 po 5ti minutach spadne. nemuzu
ani odchytit zadnou vyjimku na Application.OnException, win98 proste jen
zahlasi ze doslo k vyjimce a ukonci aplikaci. Kazde exceute v threadu mam v try
- except, veskere veci loguju, ale aplikace stejne zbuchne jako by try except
ani nebylo. mam sanci se nejak dovedet co se stalo?

chtel bych se zeptat - je nejaky znamy problem s mutexy na w98? driv jsem
pouzival kriticke sekce a aplikace fungovala.

dekuji

ps mam Delphi 5 Enterprise


jeste jeden dotaz, muzu si napsat objekt:

TMutex = class
  function Enter: boolean;
end;

a metodu:

function TMutex.Enter: boolean;
begin
  case WaitForSingleObject( fHandle, fTimeout ) of
    WAIT_OBJECT_0 :
.......

a timto zpusobem pouzivat mutexy? neni v tom nejaky problem?

Odpovedá: Petr Fejfar

22. 6. 2004 11:26

Karel Plechota wrote:


> jeste jeden dotaz, muzu si napsat objekt:
> a timto zpusobem pouzivat mutexy? neni v tom nejaky problem?

Kdyz to napises spravne, tak v tom zadny problem neni  

> chtel bych se zeptat - je nejaky znamy problem s mutexy na w98? driv
> jsem pouzival kriticke sekce a aplikace fungovala.

Pokud vim, tak jsme na nikdy na zadne problemy s mutexy pod W98 nenarazili.

***

Kdyz si myslis, ze to ma co delat s prechodem od kritickych sekci na mutexy
a mas je zapouzdrene v objektu, tak muzes zkusit napsat spolecneho predka
a zapouzdrit i kritickou sekci. Pak to muzes jednoduse prehazovat tam a
zpatky
a uvidis, jestli to ma co delat s mutexy vs. kritickymi sekcemi.

Jedine co me napada je, ze kriticka sekce nema timeout, takze pokud nemas
spravne osetrenu nedostupnost mutexu, mohlo by se ti stat, ze vlezes nekam,
kde momentalne nemas co delat a tim to zhavaruje.


HTH, pf


Odpovedá: Karel Plechota

24. 6. 2004 21:39

problem s mutexy jsem zda se vyresil. slo o to ze si za behu programu alokuju
mutexy a zase je rusim. pouzival jsem kod ktery tu kdysi byl uvedeny:

  fMutex := CreateMutex( nil, false, PChar(fNazev) );
  if GetLastError = ERROR_ALREADY_EXISTS then
    fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );

problem je ale v tom ze pokud dojde k volani OpenMutex pak v pameti zustava
handle vracene fci CreateMutex. na to jsou w98 celkem citlive - po case
spadnou.

resenim je proste handle zavrit pres CloseHandle();

good luck

Odpovedá: js-delphi@quick.cz

25. 6. 2004 8:01

Odesilatel: Karel Plechota <karel.plechota@seznam.cz>
> fMutex := CreateMutex( nil, false, PChar(fNazev) );
> if GetLastError = ERROR_ALREADY_EXISTS then
> fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
>
> problem je ale v tom ze pokud dojde k volani OpenMutex pak v
> pameti zustava handle vracene fci CreateMutex. na to jsou w98
> celkem citlive - po case spadnou.
>
> resenim je proste handle zavrit pres CloseHandle();

Ahoj.
Prosim Te, jsem asi hodne natvrdly, znamena to, ze to ma vypadat takto:
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
    CloseHandle(fMutex);
  end;

Rad bych to delal spravne...
Diky za odpoved.
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.0.3
programator amater


Odpovedá: Ondrej Kelle

25. 6. 2004 9:09

> fMutex := CreateMutex( nil, false, PChar(fNazev) );
> if GetLastError = ERROR_ALREADY_EXISTS then
> fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );

OpenMutex je tam zbytocne, ved CreateMutex bud vytvori novy mutex, alebo
otvori uz existujuci mutex.
Ty ho potom otvaras zbytocne este raz.

HTH
TOndrej


Odpovedá: Karel Plechota

25. 6. 2004 12:23

No vypada to ze OpenMutex je tam fakt zbytecne, ale vyzkousene to nemam..
funkcni kod ktery pouzivam je tento :

  fMutex := CreateMutex( nil, false, PChar(fNazev) );
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    CloseHandle(fMutex);
    fMutex := OpenMutex( MUTEX_ALL_ACCESS, false, PChar(fNazev) );
  end;

Otazkou zustava k cemu je dobra funkce OpenMutex kdyz CreateMutex by bylo
dostacujici.


> OpenMutex je tam zbytocne, ved CreateMutex bud vytvori novy mutex, alebo
> otvori uz existujuci mutex.
> Ty ho potom otvaras zbytocne este raz.


Odpovedá: Ondrej Kelle

25. 6. 2004 12:25

> Otazkou zustava k cemu je dobra funkce OpenMutex kdyz
> CreateMutex by bylo dostacujici.

Asi pre pripad, ze chces otvorit mutex, ak existuje, ale nevytvarat ho, ak
neexistuje  

HTH
TOndrej